/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package model.dao;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.ArrayList;
import java.util.logging.Level;
import java.util.logging.Logger;
import model.pojo.Turma;

/**
 *
 * @author leonidia
 */
public final class TurmaDaoImpl implements TurmaDao {

    private ArrayList<Turma> listaTurma;
    /*id de associcao da turma*/
    private ArrayList<Integer> listaAssocTurmas;
    private ArrayList<Integer> listaDisciplinas;
    private ArrayList<Integer> listaProfessores;
    private ArrayList<Integer> listaAssocTurmasAluno;
    private ArrayList<Integer> listaAlunos;

    /**
     * ************************
     */
    public TurmaDaoImpl() {
        this.listaTurma = carregarTurma();
        try {
            carregarAssociacaoTurma();
            carregarAssociacaoTurmaAluno();
        } catch (IOException ex) {
            Logger.getLogger(TurmaDaoImpl.class.getName()).log(Level.SEVERE, null, ex);

        }
    }

    @Override
    public ArrayList<Integer> getListaDisciplinas() {
        return listaDisciplinas;
    }

    @Override
    public ArrayList<Turma> getListaTurma() {
        return listaTurma;
    }

    @Override
    public void setTurma(ArrayList<Turma> turma) {
        this.listaTurma = turma;
    }

    @Override
    public ArrayList<Turma> getTurma() {
        return this.listaTurma;
    }

    @Override
    public boolean addTurma(Turma turma) {
        int i;
        if (listaTurma.contains(turma)) {
            return false;
        } else {
            this.listaTurma.add(turma);
            return true;
        }
    }

    @Override
    public void salvarTurma(ArrayList<Turma> turma) throws IOException {
        try (FileWriter writer = new FileWriter("Turmas.txt", false);
                PrintWriter saida = new PrintWriter(writer, true)) {
            int i;
            for (i = 0; i < listaTurma.size(); i++) {
                writer.write(
                        listaTurma.get(i).getId() + ";"
                        + listaTurma.get(i).getAno() + ";"
                        + listaTurma.get(i).getPeriodo() + ";"
                        + listaTurma.get(i).getLocal() + ";"
                        + listaTurma.get(i).getHorario() + ";"
                        + listaTurma.get(i).getNumeroDeVagas() + "\n");
            }
        }
    }

    @Override
    public ArrayList<Turma> carregarTurma() {
        ArrayList<Turma> listaTurma = new ArrayList<>();
        File file = new File("Turmas.txt");
        if (!file.exists()) {
            try {
                file.createNewFile();
            } catch (IOException ex) {
                return listaTurma;
            }
        }
        try (BufferedReader in = new BufferedReader(new FileReader(file))) {
            String str;
            while ((str = in.readLine()) != null) {
                String[] t = str.split(";");
                Turma turma = new Turma(Integer.parseInt(t[0]), Integer.parseInt(t[1]), Integer.parseInt(t[2]), t[3], t[4], Integer.parseInt(t[5]));
                listaTurma.add(turma);
            }
        } catch (IOException ex) {
            return listaTurma;
        }
        return listaTurma;
    }

    @Override
    public Integer novoId() {
        if (listaTurma.isEmpty()) {
            return 0;
        }
        return listaTurma.get(listaTurma.size() - 1).getId() + 1;
    }

    @Override
    public Integer ultimoId() {
        if (listaTurma.isEmpty()) {
            return 0;
        }
        return listaTurma.get(listaTurma.size() - 1).getId();
    }

    /*Implementação da Associcao Turma <Tuma,Disciplina,Professor>*/
    @Override
    public ArrayList<Integer> getListaAssocTurmas() {
        return listaAssocTurmas;
    }

    @Override
    public ArrayList<Integer> getListaProfessores() {
        return listaProfessores;
    }

    @Override
    public void setListaDisciplinas(ArrayList<Integer> listaDisciplinas) {
        this.listaDisciplinas = listaDisciplinas;
    }

    @Override
    public void setListaTurma(ArrayList<Turma> listaTurma) {
        this.listaTurma = listaTurma;
    }

    @Override
    public void setListaAssocTurmas(ArrayList<Integer> listaTurmas) {
        this.listaAssocTurmas = listaTurmas;
    }

    @Override
    public void setListaProfessores(ArrayList<Integer> listaProfessores) {
        this.listaProfessores = listaProfessores;
    }

    @Override
    public void addListaTurmas(Integer idTurma) {
        this.listaAssocTurmas.add(idTurma);
    }

    @Override
    public void addListaProfessores(Integer idProfessores) {
        this.listaProfessores.add(idProfessores);
    }

    @Override
    public void addListaDisciplinas(Integer idDisciplina) {
        this.listaDisciplinas.add(idDisciplina);
    }

    @Override
    public void salvarAssociacaoTurma() throws IOException {
        try (FileWriter writer = new FileWriter("AssociacaoTurmas.txt", false);
                PrintWriter saida = new PrintWriter(writer, true)) {
            Integer i;
            for (i = 0; i < this.listaAssocTurmas.size(); i++) {
                writer.write(this.listaAssocTurmas.get(i) + ";"
                        + this.listaDisciplinas.get(i) + ";"
                        + this.listaProfessores.get(i) + "\n");
            }
        }
    }

    @Override
    public void carregarAssociacaoTurma() throws IOException {
        this.listaDisciplinas = new ArrayList<>();
        this.listaProfessores = new ArrayList<>();
        this.listaAssocTurmas = new ArrayList<>();


        File file = new File("AssociacaoTurmas.txt");
        if (!file.exists()) {
            file.createNewFile();
        }
        try (BufferedReader in = new BufferedReader(new FileReader(file))) {
            String str;
            while ((str = in.readLine()) != null) {
                String[] t = str.split(";");
                this.listaDisciplinas.add(Integer.parseInt(t[0]));
                this.listaProfessores.add(Integer.parseInt(t[1]));
                this.listaAssocTurmas.add(Integer.parseInt(t[2]));
            }
        }
    }

    @Override
    public void salvarAssociacaoTurmaAluno() throws IOException {
        try (FileWriter writer = new FileWriter("AssociacaoTurmaAluno.txt", false);
                PrintWriter saida = new PrintWriter(writer, true)) {
            Integer i;
            for (i = 0; i < this.listaAssocTurmasAluno.size(); i++) {
                writer.write(this.listaAssocTurmasAluno.get(i) + ";" + this.listaAlunos.get(i) + "\n");
            }
        }
    }

    @Override
    public void carregarAssociacaoTurmaAluno() throws IOException {
        this.listaAlunos = new ArrayList<>();
        this.listaAssocTurmasAluno = new ArrayList<>();

        File file = new File("AssociacaoTurmaAluno.txt");
        if (!file.exists()) {
            file.createNewFile();
        }
        try (BufferedReader in = new BufferedReader(new FileReader(file))) {
            String str;
            while ((str = in.readLine()) != null) {
                String[] t = str.split(";");
                this.listaAssocTurmasAluno.add(Integer.parseInt(t[0]));
                this.listaAlunos.add(Integer.parseInt(t[1]));
            }
        }
    }

    @Override
    public boolean containTurma(Integer idTurma) {
        if (listaAssocTurmas.isEmpty()) {
            return false;
        }
        int i;
        for (i = 0; i < listaAssocTurmas.size(); i++) {
            if (idTurma == listaAssocTurmas.get(i)) {
                return true;
            }
        }
        return false;
    }

    @Override
    public Integer contadorDisciplina(Integer idDisciplina) {
        Integer i;
        Integer contador = 0;
        if (listaDisciplinas.isEmpty()) {
            return contador;
        }
        for (i = 0; i < listaDisciplinas.size(); i++) {
            if (listaDisciplinas.get(i) == idDisciplina) {
                contador++;
            }
        }
        return contador;
    }

    @Override
    public Integer contadorProfessor(Integer idProfessor) {
        Integer i;
        Integer contador = 0;
        if (listaProfessores.isEmpty()) {
            return contador;
        }
        for (i = 0; i < listaProfessores.size(); i++) {
            if (listaProfessores.get(i) == idProfessor) {
                contador++;
            }
        }
        return contador;
    }

    @Override
    public Integer getIdTurmaConsulta(Integer idDisciplina, Integer ano, Integer periodo) {
        Integer i, j;
        if (listaTurma.isEmpty()) {
            return -1;
        }

        for (j = 0; j < listaDisciplinas.size(); j++) {
            if (idDisciplina == listaDisciplinas.get(j)) {
                for (i = 0; i < listaTurma.size(); i++) {
                    if ((listaTurma.get(i).getPeriodo() == periodo) && (listaTurma.get(i).getAno() == ano)
                            && (listaAssocTurmas.get(j) == listaTurma.get(i).getId())) {
                        return listaTurma.get(i).getId();
                    }
                }
            }
        }
        return -1;
    }

    @Override
    public ArrayList<Integer> getAlunoPorIdTurma(Integer idTurma) throws IOException {
        ArrayList<Integer> listaIdAlunos = new ArrayList<>();
        Integer i;
        if (this.listaAlunos.isEmpty()) {
            return listaIdAlunos;
        }
        for (i = 0; i < this.listaAssocTurmas.size(); i++) {
            if (this.listaAssocTurmas.get(i) == idTurma) {
                listaIdAlunos.add(this.listaAlunos.get(i));
            }
        }
        return listaIdAlunos;
    }

    @Override
    public ArrayList<Integer> consultarTurmaAluno(Integer idDisciplina, Integer ano, Integer periodo) throws IOException {
        Integer idTurma = getIdTurmaConsulta(idDisciplina, ano, periodo);
        return getAlunoPorIdTurma(idTurma);
    }

    @Override
    public ArrayList<Integer> getListaAlunos() {
        return this.listaAlunos;
    }

    @Override
    public void addListaTurmaAlunos(Integer idAluno, Integer idTurma) {
        this.listaAlunos.add(idAluno);
        this.listaAssocTurmasAluno.add(idTurma);
    }
    
    public ArrayList<Integer> getDisciplinaAssocIdProfessor(Integer idProfessor) throws IOException {
        ArrayList<Integer> listaIdDisciplina = new ArrayList<>();
        Integer i;
        if (this.listaDisciplinas.isEmpty()) {
            return listaIdDisciplina;
        }
        for (i = 0; i < this.listaProfessores.size(); i++) {
            if (this.listaProfessores.get(i) == idProfessor) {
                listaIdDisciplina.add(this.listaDisciplinas.get(i));
            }
        }
        return listaIdDisciplina;
    }
}